#pragma once
#include <dcont/dprompt.h>
#include <dcont/pcorou.h>

/* 跳板 */
static MAY_UNUSED PROMPT_FUNC word_t __corou_trampoline(prompt_t *p, word_t arg){
	corou_t *cr = (corou_t *)arg;
	PARAM_USED(arg);
	prompt_t *c = p;
	cr->prm.cofun_ptr(cr->prm.ret_arg);
	prompt_return(c);
}

static MAY_UNUSED PROMPT_FUNC word_t __corou_trampoline_v(prompt_t *p, word_t arg){
	corou_t *cr = (corou_t *)arg;
	PARAM_USED(arg);
	prompt_t *c = p;
	word_t ret = cr->prm.cofun_ptr(cr->prm.ret_arg);
	prompt_return_v(c, ret);
}

/* 优化reset */
static MAY_UNUSED PROMPT_FUNC word_t __corou_trampoline_yield(prompt_t *p, word_t arg){
	// void *cr_ptr = (void *)arg;
	// corou_t *cr = (corou_t *)arg;
	PARAM_USED(arg);
	prompt_t *c = p;
	ipromptf_t *func = p->cofun_ptr;
	word_t rarg = p->ret_arg;
	prompt_yield(c);
	func(rarg);
	prompt_return(c);
}

/* 优化reset */
static MAY_UNUSED PROMPT_FUNC word_t __corou_trampoline_yieldv(prompt_t *p, word_t arg){
	// void *cr_ptr = (void *)arg;
	// corou_t *cr = (corou_t *)arg;
	PARAM_USED(arg);
	prompt_t *c = p;
	ipromptf_t *func = p->cofun_ptr;
	word_t rarg = p->ret_arg;
	prompt_yield(c);
	word_t ret = (word_t)func(rarg);
	prompt_return_v(c, ret);
}
